
#ifndef __TABLAHASH_H__
#define __TABLAHASH_H__

#include "Bucket.h"

	typedef struct TablaHash
	{
		TamBucket tamanioBucket;
		unsigned int tamanioTabla;
		unsigned int * Buckets; // Lista de numeros de bloques
		enum TBOOL * BloquesTabla; // Lista de indicadores para saber que bloque en el archivo de Tabla es necesario actualizar. Valores: '0' o '1'
		unsigned int cantBuckets; // Suma de la cantidad de Buckets utilizados y los Buckets libres. Se usa para asginarle el nroBucket a un Bucket nuevo.
	}TablaHash;

	/* Crea una tabla y la deja en un estado valido. */
	TablaHash* crearTabla();

	/* Devuelve el indice del bloque que contiene la clave en la Tabla, funcion de hashing modular*/
	unsigned int IndiceEnTabla (TClave clave, unsigned int tamanioTabla);

	/*Asigna la direccion de un bloque dentro de un rango del vector DirBloques*/
	void GuardarBloqueEnTabla (TablaHash* tabla, unsigned int nroBloque, unsigned int dispersion, int indice);

	/*PRE: recibe la tabla, el valor del nuevo bloque creado y la posicion donde debe insertarse en la tabla*/
	int DuplicarTabla (TablaHash* tabla);

	/* si ambas mitades de la tabla son iguales la trunca, si se elimino el ultimo bloque, la tabla queda vacia
	 * Actualiza el archivo de Tabla
	 * */
	int ReducirTabla (TablaHash* tabla, FILE * archTabla);

	/*Calcula la cantidad de bloques que se usan en el archivo de Tabla*/
	int getCantBloquesTabla (TablaHash tabla);

	/*Copia un bloque de la tabla en un vector de char para persistir*/
	void BloqueTablaABytes(TablaHash* tabla, char* bloqueAPersistir, int nroBloque);

	/*Guarda la tabla en el archivo correspondiente. Devuelve OK si se escribio bien, de lo contrario devuelve ERROR*/
	int GuardarTabla (FILE* archTabla, TablaHash* tabla);

	/*Copia datos de control a un vector de char para persistir la MetaData*/
	void MetaDataABytes(TablaHash* tabla, char* metadata);

	/*Guarda solo la MetaData en el archivo de Tabla, ocupando sólo los primeros 512 bytes*/
	int GuardarMetaData (FILE* archTabla, TablaHash* tabla);

	/*Levanta la tabla del archivo correspondiente, buscado en hash, llama a crearTabla*/
	TablaHash* LevantarTabla (FILE* archTabla, TamBucket tamanioBucket);

	void visualizarTabla(TablaHash* tabla, FILE* salida);

	/*levanta la tabla desde dos vectores de char (uno con el tamanio y otro con el resto de los datos*/
	/*void LevantarTabla (TablaHash* tabla, char* tablaArchivo, char* tamanioTabla);*/

#endif /*__TABLAHASH_H__*/
